"""
执行结果数据格式：
{
    1、套件编号
    2、用例总数
    3、成功数量
    4、失败数量
    5、错误数量
    6、跳过的数量(前置执行错误，所有的用例都跳过执行)
    7、套件名称
    8、开始执行时间
    9、执行总时长
    10、套件执行日志信息
    11、用例执行详情:[
        {
            1、用例ID: N01
            2、用例名称：XXX
            3、执行结果：成功、失败、错误、跳过，
            4、执行步骤:
            5、日步骤执行日志
            6、执行结果截图：
        },
        {
            1、用例ID: N02
            2、用例名称：XXX2
            3、执行结果：成功、失败、错误、跳过，
            4、执行步骤:
            5、日步骤执行日志
            6、执行结果截图：
        }
    ],
    12、未执行用例数量
    13、未执行的用例详情
}

"""

import time


class ActionResult:
    """执行结果"""

    def __init__(self, suite, config):
        self.suite = suite  # 执行的测试套件数据
        self.test_env = config  # 测试环境配置
        self.all = len(suite.get('cases',  []))

        self.success = 0  # 成功数量
        self.fail = 0  # 失败数量
        self.error = 0  # 错误数量
        self.skip = 0  # 跳过的数量
        self.no_run = 0  # 未执行数量

        self.start_time = None  # 开始执行时间
        self.duration = None  # 执行时长
        self.suite_log = []  # 套件执行日志

        self.run_cases = []  # 执行用例详情
        self.no_run_cases = []  # 未执行用例详情

    def add_success(self, _case, _log, img):
        """
        :param _case: 执行成功的用例
        :param _log:  用例的执行日志
        :param img: 用例执行结果的截图
        :return:
        """
        self.success += 1
        # 为用例结构添加三个字段：state、log_data、img。然后添加到实例属性中
        _case['state'] = 'success'
        _case['log_data'] = _log
        _case['img'] = img
        self.run_cases.append(_case)

    def add_fail(self, _case, _log, img):
        """
        :param _case: 执行失败的用例
        :param _log: 失败的用例日志
        :param img: 执行结果的截图
        :return:
        """
        self.fail += 1
        _case['state'] = 'fail'
        _case['log_data'] = _log
        _case['img'] = img
        self.run_cases.append(_case)

    def add_error(self, _case, _log, img):
        """
        :param _case: 执行错误的用例
        :param _log: 错误的用例日志
        :param img: 执行结果的截图
        :return:
        """
        self.error += 1
        _case['state'] = 'error'
        _case['log_data'] = _log
        _case['img'] = img
        self.run_cases.append(_case)

    def add_skip(self, _case):
        """
        :param _case: 跳过的用例
        :return:
        """
        self.skip += 1
        _case['state'] = 'skip'
        self.run_cases.append(_case)

    def add_no_run(self, _case):
        """
        :param _case: 未执行的用例
        :return:
        """
        self.no_run += 1
        _case['state'] = 'no_run'
        self.no_run_cases.append(_case)

    def suite_run_start(self):
        """套件开始执行"""

        self.start_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        self._time = time.time()

    def _identify_no_run_cases(self):
        """检查并添加未执行的用例"""
        # 获取所有已经执行过的用例id列表
        run_case_ids = [i.get('id') for i in self.run_cases]
        # 遍历套件中的所有用例
        for case_ in self.suite.get('cases', []):
            # 如果用例不在执行过的用例列表中，则说明该用例未执行
            if case_.get('id') not in run_case_ids:
                # 记录一条未执行的用例
                self.add_no_run(case_)

    def suite_run_end(self, suite_log):
        """测试套件执行结束"""

        # 获取运行的总时长
        self.duration = time.time() - self._time

        # 保存测试套件的日志
        self.suite_log = suite_log

        # 添加未运行用例
        # 判断执行的用例总数，如果不相等，则说明有用例未执行
        if not (self.all == self.success + self.fail + self.error + self.skip):
            self._identify_no_run_cases()


    def get_result(self):
        """获取执行结果的方法"""
        return {
            'suite_id': self.suite.get('id'),
            'suite_name': self.suite.get('name'),
            'all': self.all,
            'success': self.success,
            'fail': self.fail,
            'error': self.error,
            'skip': self.skip,
            'no_run': self.no_run,
            'start_time': self.start_time,
            'duration': self.duration,
            'suite_log': self.suite_log,
            'run_cases': self.run_cases,
            'no_run_cases': self.no_run_cases,
            'test_env': self.test_env,
        }
